package com.kevin.Code.Hash;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Vinlee Xiao
 * @Classname SingleNumber
 * @Description Leetcode 136只出现一次的数字
 * @Date 2021/10/23 19:12
 * @Version 1.0
 */
public class SingleNumber {


    /**
     * 使用hashmap
     *
     * @param nums
     * @return
     */
    public int singleNumber(int[] nums) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();

        int len = nums.length;

        for (int i = 0; i < len; i++) {

            if (hashMap.containsKey(nums[i])) {
                int cnt = hashMap.get(nums[i]);
                hashMap.put(nums[i], cnt + 1);
            } else {
                hashMap.put(nums[i], 1);
            }
        }

        for (Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {
            if (entry.getValue() == 1) {
                return entry.getKey();
            }

        }

        return 0;
    }

    /**
     * @param nums
     * @return
     */
    public int singleNumber1(int[] nums) {

        int len = nums.length;
        if (len == 1) {
            return nums[0];
        }

        Arrays.sort(nums);


        for (int i = 1; i < len - 1; i++) {
            if (nums[i] == nums[i - 1]) {
                i++;
//                if (i== len-1){
//                    return nums[i];
//                }
            } else {
                if (i + 1 < len && nums[i] == nums[i + 1]) {
                    return nums[i - 1];
                } else {
                    return nums[i];
                }
            }
        }
        return nums[len - 1];
    }

    /**
     * 最好的做法为异或运算
     *
     * @param nums
     * @return
     */
    public int singleNumber2(int[] nums) {

        int len = nums.length;

        if (len == 1) {
            return nums[0];
        }

        int res = nums[0];

        for (int i = 1; i < len; i++) {

            res = res ^ nums[i];
        }

        return res;
    }

}
